/*
结构体
    将多个不同类型数据整合为一个结构体类型 ----自定义数据类型
    结构体类型声明
        struct 类型名
        {
            成员列表
        };
    定义一个结构体变量
        结构体类型  变量名;
        变量之间是可以相互赋值的
        在定义一个结构体变量初始化赋值时，如果没有指定成员必须按照结构体内的成员顺序一一对应赋值，如果指定成员可以打乱顺序
        输入 和 输出
    成员的访问
            .  :  变量.成员    打点调用
    内存：
        字节对齐，按照字节高的对齐，不够的补齐
    typedef 关键字
            重命名 /取别名   typedef 原名  新名1,新名2,...(可以用很多名字来命名)
            typedef int zhengxing,zx,zhengx;
            zhengx a=10;
            zhengxing b=20;
            zx c=30;
            printf("a=%d,b=%d,c=%d\n",a,b,c);//此时结果可以打印输出
            -----------------------------------------------------
            typedef struct student
            {
                int num;//序号
                char name[20];//姓名
                double score;//成绩
                birth data;//出生日期 ===结构体套结构体
            }student,*node;//将struct student 类型重命名为student类型  或者a类型
            //等价于 typedef struct student * node;
            //node 代替了struct student *, 当前这个node是一个结构体指针类型
    结构体数组
            数据类型  数组名[常量];
    结构体指针
            数据类型  *指针变量名;
            可以直接通过指针间接访问成员
            student a,*p=&a;
            访问成员的两种方法：  1)(*p).name    2)p->name
*/
#include <stdio.h>
#include <string.h>
typedef struct birthday
{
    int year;
    int month;
    int day;
}birth;
//结构体数组和结构体指针
typedef struct student
{
    int num;//序号
    char name[20];//姓名
    double score;//成绩
    birth data;//出生日期 ===结构体套结构体
}student;//将struct student 类型重命名为student类型  或者a类型
void func1(student arr[])
{
    //重新定义一个数组并且初始化赋值
    student temp[3]=
    {{.num=1001,.name="liuhuan",.score=99},
    {.num=1002,.name="lisangyi",.score=88},
    {.num=1003,.name="wanghong",.score=59}};
    //内存复制函数 将temp数组复制给arr
    memcpy(arr,temp,sizeof(temp));
    int i;
    for(i=0;i<3;i++)
    {
        printf("num:%d,name:%s,score:%.1lf\n",arr[i].num,arr[i].name,arr[i].score);
    }
    printf("----------------------------\n");
}
//当前这个指针变量p指向arr的首地址
void func2(student *p)
{
    int i;
    for(i=0;i<3;i++)
    {
        printf("num:%d,name:%s,score:%.1lf\n",(*p).num,(*p).name,(*p).score);
        p++;//指向下一个元素
    }
    printf("----------------------------\n");
}
void func3(student *p)
{
    int i;
    for(i=0;i<3;i++)
    {
        printf("num:%d,name:%s,score:%.1lf\n",p->num,p->name,p->score);
        p++;//指向下一个元素
    }
    printf("----------------------------\n");
}
void test1(void)
{
    student arr[3]={0};
    func1(arr);//通过下标方式  传递数组名   在函数实现端也是用数组接收的
    func2(arr);
    func3(arr);
    
}
int main(void)
{
    student wh;//结构体变量
    printf("学号：");
    scanf("%d",&wh.num);
    printf("姓名：");
    scanf("%s",wh.name);
    printf("成绩：");
    scanf("%lf",&wh.score);
    printf("出生日期：xx-xx-xx");
    scanf("%d-%d-%d",&wh.data.year,&wh.data.month,&wh.data.day);
    printf("wh的个人信息如下：\n");
    printf("学号：%d,姓名：%s,成绩：%.2lf,出生日期：%d-%d-%d\n",wh.num,wh.name,wh.score,wh.data.year,wh.data.month,wh.data.day);
    return 0;
}

#if (0)
//声明一个结构体类型
struct people
{
    char name[20];
    char sex;
    double h;
    double w;
    int age;
}b={"liuhuan",'w',1.60,50,21};//声明结构体类型的同时，定义了一个变量b
struct people a={.h=1.75,.w=75,.age=23,.name="wanghong",.sex='w'};//定义了一个结构体类型变量a并初始化赋值

int main(void)
{
    //访问b的信息
    printf("姓名：%s\n",b.name);
    printf("性别：%c\n",b.sex);
    printf("身高：%.2lfm\n",b.h);
    printf("体重：%.2lfkg\n",b.w);
    printf("年龄：%d岁\n",b.age);
    printf("----------------------------\n");
    //访问a的信息
    printf("姓名：%s\n",a.name);
    printf("性别：%c\n",a.sex);
    printf("身高：%.2lfm\n",a.h);
    printf("体重：%.2lfkg\n",a.w);
    printf("年龄：%d岁\n",a.age);
    printf("----------------------------\n");
    //将a赋值给b  并输出b的信息
    //访问b的信息
    b=a;
    printf("姓名：%s\n",b.name);
    printf("性别：%c\n",b.sex);
    printf("身高：%.2lfm\n",b.h);
    printf("体重：%.2lfkg\n",b.w);
    printf("年龄：%d岁\n",b.age);
    printf("----------------------------\n");
    //内存大小
    printf("int类型size:%zu\n",sizeof(int));
    printf("struct people类型size:%zu\n",sizeof(struct people));
    //修改b的姓名 
    //b.name="zhaoliu";xxxxx   成员为字符串是不可以直接赋值
    strcpy(b.name,"lisangyi");
    b.age=100;
    b.sex='m';
    printf("修改b的信息后:\n");
    printf("姓名：%s\n",b.name);
    printf("性别：%c\n",b.sex);
    printf("身高：%.2lfm\n",b.h);
    printf("体重：%.2lfkg\n",b.w);
    printf("年龄：%d岁\n",b.age);
    printf("----------------------------\n");
    //对a进行输入
    printf("姓名：");
    scanf("%s",a.name);
    getchar();//为了将回车读走
    printf("性别：");
    scanf("%c",&a.sex);
    printf("身高：");
    scanf("%lf",&a.h);
    printf("体重：");
    scanf("%lf",&a.w);
    printf("年龄：");
    scanf("%d",&a.age);
    printf("----------------------------\n");
    printf("输入后输出a的信息\n");
    printf("姓名：%s\n",a.name);
    printf("性别：%c\n",a.sex);
    printf("身高：%.2lfm\n",a.h);
    printf("体重：%.2lfkg\n",a.w);
    printf("年龄：%d岁\n",a.age);
    printf("----------------------------\n");
}
#endif